﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Practices.Unity;
using Iacym.Entities;
using Iacym.BusinessLogic;

namespace Iacym.UI
{
    public partial class FrmMatrimonio : Form
    {
        [Dependency]
        public IMatrimonioBL matrimonioBL { get; set; }

        [Dependency]
        public IUsuarioMenuBL usuMenuBL { get; set; }

        [Dependency]
        public IHijoBL hijoBL { get; set; }

        public FrmMatrimonio()
        {
            InitializeComponent();
            this.BuildUp();
        }

        public USUARIO currentUsuarioMatrimonio { get; set; }

        private void FrmMatrimonio_Load(object sender, EventArgs e)
        {
            if (currentUsuarioMatrimonio != null)
            {
                menuLlena();
            }
            else
            {
                CargarDatos();
                SetearEdades();
            }
        }

        public void menuLlena()
        {
            var datoUsuario = usuMenuBL.GetAllFromUsuarioByPersonaFromLogin(currentUsuarioMatrimonio.PERSONA.Dni);

            var permisos = (from p in usuMenuBL.GetAllUsuarioMenu(datoUsuario.UsuarioId)
                            select p.MENU.Tag.ToString()).ToArray();

            System.Windows.Forms.Button[] botones = new System.Windows.Forms.Button[] { 
            this.BtnCrear,this.BtnEditar};

            var noVisible = from nv in botones
                            where !permisos.Contains(nv.Tag.ToString())
                            select nv;

            noVisible.ToList().ForEach(nv => nv.Enabled = false);

            CargarDatos();
            SetearEdades();
        }

        public void SetearEdades()
        {
            var matriDB = matrimonioBL.GetAllFromMatrimonio();

            for (int i = 0; i < matriDB.Count; i++)
            {
                foreach (var item in matriDB.ToList())
                {
                    mATRIMONIODataGridView.Rows[i].Cells[3].Value =
                        DateTime.Now.Day.Equals(item.PERSONA1.FechaNacimiento.Day) || DateTime.Now.Month > item.PERSONA1.FechaNacimiento.Month
                            ? (DateTime.Now.Year - item.PERSONA1.FechaNacimiento.Year)
                            : ((DateTime.Now.Year - item.PERSONA1.FechaNacimiento.Year) - 1);

                    mATRIMONIODataGridView.Rows[i].Cells[5].Value =
                        DateTime.Now.Day.Equals(item.PERSONA.FechaNacimiento.Day) || DateTime.Now.Month > item.PERSONA.FechaNacimiento.Month
                            ? (DateTime.Now.Year - item.PERSONA.FechaNacimiento.Year).ToString()
                            : ((DateTime.Now.Year - item.PERSONA.FechaNacimiento.Year) - 1).ToString();
                }
                mATRIMONIODataGridView.Update();
                mATRIMONIODataGridView.Refresh();
            }
        }

        public void CargarDatos()
        {
            mATRIMONIOBindingSource.DataSource = matrimonioBL.GetAllFromMatrimonio();
        }

        private void BtnCrear_Click(object sender, EventArgs e)
        {
            FrmMttoMatrimonio frm = new FrmMttoMatrimonio();
            frm.Nuevo();
            frm.ShowDialog();
            CargarDatos();
            SetearEdades();
        }

        private void BtnEditar_Click(object sender, EventArgs e)
        {
            var currentMatrimonio = mATRIMONIOBindingSource.Current as MATRIMONIO;

                if (currentMatrimonio != null)
                {
                    FrmMttoMatrimonio frm = new FrmMttoMatrimonio();
                    //frm.CurrentMatrimonio = currentMatrimonio;
                    frm.Editar(currentMatrimonio.Id);
                    frm.ShowDialog();
                    CargarDatos();
                    SetearEdades();
                    RefrescarHijos(currentMatrimonio.Id);
                    SetearEdadesHijos(currentMatrimonio.Id);
                }
                else
                {
                    MessageBox.Show(@"Debe seleccionar un Matrimonio", @"Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }  
        }

        public void RefrescarHijos(Int32 matrimononioId)
        {
            hIJOSBindingSource.DataSource = hijoBL.GetAllFromHijosByMatrimonioId(matrimononioId);
        }

        public void SetearEdadesHijos(Int32 matrimononioId)
        {
            var hijosBD = hijoBL.GetAllFromHijosByMatrimonioId(matrimononioId);

            for (int i = 0; i < hijosBD.Count; i++)
            {
                foreach (var hijo in hijosBD.ToList())
                {
                    hIJOSDataGridView.Rows[i].Cells[1].Value =
                        DateTime.Now.Day.Equals(hijo.PERSONA.FechaNacimiento.Day) || DateTime.Now.Month > hijo.PERSONA.FechaNacimiento.Month
                            ? (DateTime.Now.Year - hijo.PERSONA.FechaNacimiento.Year).ToString()
                            : ((DateTime.Now.Year - hijo.PERSONA.FechaNacimiento.Year) - 1).ToString();
                }
            }
        }

        private void BtnBuscar_Click(object sender, EventArgs e)
        {
            mATRIMONIOBindingSource.DataSource = matrimonioBL.GetFromMatrimonioByPersona(TxtDescripcion.Text);
        }

        private void TxtDescripcion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                mATRIMONIOBindingSource.DataSource = matrimonioBL.GetFromMatrimonioByPersona(TxtDescripcion.Text);
            }
        }
    }
}
